﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using MySql.Data.MySqlClient;

namespace MakeIT.MiraPark.Negocios
{
    public static partial class ModelBO
    {

        public static MySqlCommand getConnection()
        {
            try
            {
                MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
                MySqlCommand cmd = new MySqlCommand();
                cmd.Connection = conn;
                return cmd;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public static UsuarioVO getUsuario(string user, bool comPerfis, bool comObjetos)
        {
            UsuarioVO usuarioVO = null;
            List<UsuarioVO> usuarios = getUsuarios(user);
            if (usuarios != null && usuarios.Count > 0)
            {
                usuarioVO = usuarios[0];
                if (comPerfis)
                    getPerfilXUsuarios(usuarioVO);
                if (comObjetos)
                    getUsuarioXObjetos(usuarioVO);
            }
            return usuarioVO;
           
        }

        public static UsuarioVO getUsuario(int IdUser, bool comPerfis, bool comObjetos)
        {
            UsuarioVO usuarioVO = null;
            List<UsuarioVO> usuarios = getUsuarios(IdUser);
            if (usuarios != null && usuarios.Count > 0)
            {
                usuarioVO = usuarios[0];
                if (comPerfis)
                    getPerfilXUsuarios(usuarioVO);
                if (comObjetos)
                    getUsuarioXObjetos(usuarioVO);
            }
            return usuarioVO;

        }

        public static List<UsuarioVO> getUsuarios(bool comPerfis, bool comObjetos)
        {
            List<UsuarioVO> usuarios = getUsuarios();
            if (comPerfis)
            {
                foreach (UsuarioVO user in usuarios)
                {
                    getPerfilXUsuarios(user);
                }
            }
            if (comObjetos)
            {
                foreach (UsuarioVO user in usuarios)
                {
                    getUsuarioXObjetos(user);
                }
            }
            return usuarios;
        }

        public static List<UsuarioVO> getUsuarios()
        {
            return getUsuarios(null, null, false);
        }

        public static List<UsuarioVO> getUsuarios(string user)
        {
            return getUsuarios(user, null, false);
        }

        public static List<UsuarioVO> getUsuarios(int IdUser)
        {
            return getUsuarios(null, IdUser, false);
        }

        public static List<UsuarioVO> getUsuarios(string user, int? idUser, bool ativo)
        {
            string where = "WHERE ";
            StringBuilder query = new StringBuilder();

            query.AppendLine("SELECT IdUsuario, Usuario, Nome, Senha, Cadastro, Ativo ");
            query.AppendLine("FROM usuario ");
            if (user != null)
            {
                query.AppendLine(where + "Usuario=?Usuario ");
                where = "and ";
            }
            if (idUser != null)
            {
                query.AppendLine(where + "IdUsuario=?IdUsuario ");
                where = "and ";
            }
            if (ativo)
            {
                query.AppendLine(where + "Ativo=?Ativo ");
                where = "and ";
            }
            query.AppendLine("ORDER BY usuario ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            if (user != null) cmd.Parameters.AddWithValue("?Usuario", user);
            if (idUser != null) cmd.Parameters.AddWithValue("?IdUsuario", idUser);
            if (ativo) cmd.Parameters.AddWithValue("?Ativo", ativo);

            MySqlDataReader reader = null;
            try
            {
                cmd.Connection.Open();

                reader = cmd.ExecuteReader();

                List<UsuarioVO> listUsuario = new List<UsuarioVO>();

                while (reader.Read())
                {
                    UsuarioVO usuarioVO = UsuarioVO.CreateUsuarioVO();
                    usuarioVO.idUsuario = reader.GetInt32("IdUsuario");
                    usuarioVO.usuario = reader.GetString("Usuario");
                    usuarioVO.nome = reader.GetString("Nome");
                    usuarioVO.senha = reader.GetString("Senha");
                    usuarioVO.ativo = reader.GetBoolean("Ativo");
                    usuarioVO.cadastro = reader.GetDateTime("Cadastro");

                    listUsuario.Add(usuarioVO);
                }
                reader.Close();
                return listUsuario;
            }
            catch (Exception ex){ throw ex; }
            finally { cmd.Connection.Close(); }
        }

        public static void setUsuario(UsuarioVO usuarioVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("UPDATE usuario ");
            query.AppendLine("SET Usuario=?Usuario, Nome=?Nome, Senha=?Senha, Cadastro=?Cadastro, Ativo=?Ativo ");
            query.AppendLine("WHERE IdUsuario=?IdUsuario ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdUsuario", usuarioVO.idUsuario);
            cmd.Parameters.AddWithValue("?Usuario", usuarioVO.usuario);
            cmd.Parameters.AddWithValue("?Nome", usuarioVO.nome);
            cmd.Parameters.AddWithValue("?Senha", usuarioVO.senha);
            cmd.Parameters.AddWithValue("?Cadastro", usuarioVO.cadastro);
            cmd.Parameters.AddWithValue("?Ativo", usuarioVO.ativo);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static long newUsuario(UsuarioVO usuarioVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("INSERT INTO usuario ");
            query.AppendLine("SET Usuario=?Usuario, Nome=?Nome, Senha=?Senha, Cadastro=?Cadastro, Ativo=?Ativo ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?Usuario", usuarioVO.usuario);
            cmd.Parameters.AddWithValue("?Nome", usuarioVO.nome);
            cmd.Parameters.AddWithValue("?Senha", usuarioVO.senha);
            cmd.Parameters.AddWithValue("?Cadastro", usuarioVO.cadastro);
            cmd.Parameters.AddWithValue("?Ativo", usuarioVO.ativo);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
                return cmd.LastInsertedId;
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }

        public static void delUsuario(UsuarioVO usuarioVO)
        {
            StringBuilder query = new StringBuilder();

            query.AppendLine("DELETE FROM usuario ");
            query.AppendLine("WHERE IdUsuario=?IdUsuario ");

            MySqlCommand cmd = getConnection();
            cmd.CommandText = query.ToString();

            cmd.Parameters.AddWithValue("?IdUsuario", usuarioVO.idUsuario);

            try
            {
                cmd.Connection.Open();

                cmd.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
            finally { cmd.Connection.Close(); }

        }
    }
}
